home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / calmenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  15KB  |  545 lines

  1. /*
  2.  * Create the main calendar window and everything in it. That isn't all that
  3.  * much because the calendar itself is drawn using Xlib calls. Attempts to
  4.  * do that with Motif were spectacularly slow.
  5.  *
  6.  *    create_cal_widgets(toplevel)    Create all widgets in main calendar
  7.  *                    window.
  8.  */
  9.  
  10. #ifndef MIPS
  11. #include <stdlib.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <time.h>
  15. #include <varargs.h>
  16. #include <Xm/Xm.h>
  17. #include <Xm/MainW.h>
  18. #include <Xm/Form.h>
  19. #include <Xm/Frame.h>
  20. #include <Xm/RowColumn.h>
  21. #include <Xm/LabelP.h>
  22. #include <Xm/PushBP.h>
  23. #include <Xm/PushBG.h>
  24. #include <Xm/Text.h>
  25. #include <Xm/Protocols.h>
  26. #include <X11/cursorfont.h>
  27. #include "cal.h"
  28.  
  29. static void filemenu_callback(), configmenu_callback(), search_callback(),
  30.         delpast_callback(), view_callback(), help_pulldown();
  31. extern char *mkdatestring(), *mktimestring();
  32. extern time_t length_of_month();
  33. extern void help_callback();
  34. extern struct tm *time_to_tm();
  35. extern time_t get_time();
  36.  
  37. extern Display        *display;    /* everybody uses the same server */
  38. extern GC        gc;        /* everybody uses this context */
  39. extern struct config    config;        /* global configuration data */
  40. extern struct list    *mainlist;    /* list of all schedule entries */
  41. extern struct mainmenu    mainmenu;    /* all important main window widgets */
  42. extern Pixel        color[NCOLS];    /* colors: COL_* */
  43. extern int        curr_month;    /* month being displayed, 0..11 */
  44. extern int        curr_year;    /* year being displayed, since 1900 */
  45. extern time_t        curr_week;    /* week being displayed, time in sec */
  46. Widget            mainwindow;    /* popup menus hang off main window */
  47.  
  48. #ifdef FIXMBAR
  49. #define FIX_MENUBAR XmVaSEPARATOR,
  50. #else
  51. #define FIX_MENUBAR
  52. #endif
  53.  
  54. #ifdef NOMSEP
  55. #define XM_VA_SEPARATOR
  56. #else
  57. #define XM_VA_SEPARATOR XmVaSEPARATOR,
  58. #endif
  59.  
  60.  
  61.  
  62. create_cal_widgets(toplevel)
  63.     Widget            toplevel;
  64. {
  65.     Widget            menubar, menu, fmenu, w;
  66.     XmString        s[20];
  67.     int            n;
  68.  
  69.     mainwindow = XtCreateManagedWidget("mainwindow",
  70.             xmMainWindowWidgetClass, toplevel, NULL, 0);
  71.  
  72.     /*------------------------------------- menu bar -------------------*/
  73.     s[0] = XmStringCreateSimple("File");
  74.     s[1] = XmStringCreateSimple("Config");
  75.     s[2] = XmStringCreateSimple("Search");
  76.     s[3] = XmStringCreateSimple("View");
  77.     s[4] = XmStringCreateSimple("Help");
  78.     menubar = XmVaCreateSimpleMenuBar(mainwindow, "menubar",
  79.             FIX_MENUBAR
  80.             XmVaCASCADEBUTTON, s[0], 'F',
  81.             XmVaCASCADEBUTTON, s[1], 'C',
  82.             XmVaCASCADEBUTTON, s[2], 'S',
  83.             XmVaCASCADEBUTTON, s[3], 'V',
  84.             XmVaCASCADEBUTTON, s[4], 'H',
  85.             NULL);
  86.     if (w = XtNameToWidget(menubar, "button_4"))
  87.         XtVaSetValues(menubar, XmNmenuHelpWidget, w, 0);
  88.     for (n=0; n < 5; n++)
  89.         XmStringFree(s[n]);
  90.  
  91.     s[0] = XmStringCreateSimple("Print...");
  92.     s[1] = XmStringCreateSimple("Delete past entries");
  93.     s[2] = XmStringCreateSimple("About...");
  94.     s[3] = XmStringCreateSimple("Quit");
  95.     fmenu = XmVaCreateSimplePulldownMenu(menubar, "file", 0,
  96.             filemenu_callback,
  97.             FIX_MENUBAR
  98.             XmVaPUSHBUTTON,    s[0], 'P', NULL, NULL,
  99.             XmVaCASCADEBUTTON, s[1], 'D',
  100.             XmVaPUSHBUTTON,    s[2], 'A', NULL, NULL,
  101.             XmVaPUSHBUTTON,    s[3], 'Q', NULL, NULL,
  102.             NULL);
  103.     XtAddCallback(fmenu, XmNhelpCallback,
  104.                     help_callback, (XtPointer)"pd_file");
  105.     for (n=0; n < 4; n++)
  106.         XmStringFree(s[n]);
  107.  
  108.     s[0] = XmStringCreateSimple("older than one day");
  109.     s[1] = XmStringCreateSimple("older than one week");
  110.     s[2] = XmStringCreateSimple("older than one month");
  111.     s[3] = XmStringCreateSimple("older than 90 days");
  112.     s[4] = XmStringCreateSimple("older than one year");
  113.     fmenu = XmVaCreateSimplePulldownMenu(fmenu, "delpast", 1,
  114.             delpast_callback,
  115.             FIX_MENUBAR
  116.             XmVaPUSHBUTTON,    s[0], 'd',  NULL, NULL,
  117.             XmVaPUSHBUTTON,    s[1], 'w',  NULL, NULL,
  118.             XmVaPUSHBUTTON,    s[2], 'm',  NULL, NULL,
  119.             XmVaPUSHBUTTON,    s[3], '9',  NULL, NULL,
  120.             XmVaPUSHBUTTON,    s[4], 'y',  NULL, NULL,
  121.             NULL);
  122.     XtAddCallback(fmenu, XmNhelpCallback,
  123.                     help_callback, (XtPointer)"pd_file");
  124.     for (n=0; n < 4; n++)
  125.         XmStringFree(s[n]);
  126.  
  127.     s[0]  = XmStringCreateSimple("12-hour mode");
  128.     s[1]  = XmStringCreateSimple("Sunday first");
  129.     s[2]  = XmStringCreateSimple("Month/Day/Year");
  130.     s[3]  = XmStringCreateSimple("Julian Dates");
  131.     s[4]  = XmStringCreateSimple("Week numbers");
  132.     s[5]  = XmStringCreateSimple("Auto delete past entries");
  133.     s[6]  = XmStringCreateSimple("Don't show today's past");
  134.     s[7]  = XmStringCreateSimple("Fast warning entry mode");
  135.     s[8]  = XmStringCreateSimple("Adjust time...");
  136.     s[9]  = XmStringCreateSimple("Alarm options...");
  137.     s[10] = XmStringCreateSimple("Define holidays...");
  138.     s[11] = XmStringCreateSimple("Configure week view...");
  139.     menu = XmVaCreateSimplePulldownMenu(menubar, "config", 1,
  140.             configmenu_callback,
  141.             FIX_MENUBAR
  142.             XmVaCHECKBUTTON, s[0],  '1', NULL, NULL,
  143.             XmVaCHECKBUTTON, s[1],  'S', NULL, NULL,
  144.             XmVaCHECKBUTTON, s[2],  'M', NULL, NULL,
  145.             XM_VA_SEPARATOR
  146.             XmVaCHECKBUTTON, s[3],  'J', NULL, NULL,
  147.             XmVaCHECKBUTTON, s[4],  'W', NULL, NULL,
  148.             XM_VA_SEPARATOR
  149.             XmVaCHECKBUTTON, s[5],  'A', NULL, NULL,
  150.             XmVaCHECKBUTTON, s[6],  'D', NULL, NULL,
  151.             XmVaCHECKBUTTON, s[7],  'F', NULL, NULL,
  152.             XM_VA_SEPARATOR
  153.             XmVaPUSHBUTTON,  s[8],  't', NULL, NULL,
  154.             XmVaPUSHBUTTON,  s[9],  'o', NULL, NULL,
  155.             XmVaPUSHBUTTON,  s[10], 'h', NULL, NULL,
  156.             XmVaPUSHBUTTON,  s[11], 'C', NULL, NULL,
  157.             NULL);
  158.     XtAddCallback(menu, XmNhelpCallback,
  159.                     help_callback, (XtPointer)"pd_config");
  160.     if (w = XtNameToWidget(menu, "button_0"))
  161.         XtVaSetValues(w, XmNset,        config.ampm,
  162.                  XmNvisibleWhenOff,    True, NULL);
  163.     if (w = XtNameToWidget(menu, "button_1"))
  164.         XtVaSetValues(w, XmNset,        config.sunday_first,
  165.                  XmNvisibleWhenOff,    True, NULL);
  166.     if (w = XtNameToWidget(menu, "button_2"))
  167.         XtVaSetValues(w, XmNset,        config.mmddyy,
  168.                  XmNvisibleWhenOff,    True, NULL);
  169.     if (w = XtNameToWidget(menu, "button_3"))
  170.         XtVaSetValues(w, XmNset,        config.julian,
  171.                  XmNvisibleWhenOff,    True, NULL);
  172.     if (w = XtNameToWidget(menu, "button_4"))
  173.         XtVaSetValues(w, XmNset,        config.weeknum,
  174.                  XmNvisibleWhenOff,    True, NULL);
  175.     if (w = XtNameToWidget(menu, "button_5"))
  176.         XtVaSetValues(w, XmNset,        config.autodel,
  177.                  XmNvisibleWhenOff,    True, NULL);
  178.     if (w = XtNameToWidget(menu, "button_6"))
  179.         XtVaSetValues(w, XmNset,        config.nopast,
  180.                  XmNvisibleWhenOff,    True, NULL);
  181.     if (w = XtNameToWidget(menu, "button_7"))
  182.         XtVaSetValues(w, XmNset,        config.bigwarning,
  183.                  XmNvisibleWhenOff,    True, NULL);
  184.     if (w = XtNameToWidget(menu, "button_0"))
  185.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  186.     if (w = XtNameToWidget(menu, "button_1"))
  187.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  188.     if (w = XtNameToWidget(menu, "button_2"))
  189.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  190.     if (w = XtNameToWidget(menu, "button_3"))
  191.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  192.     if (w = XtNameToWidget(menu, "button_4"))
  193.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  194.     if (w = XtNameToWidget(menu, "button_5"))
  195.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  196.     if (w = XtNameToWidget(menu, "button_6"))
  197.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  198.     if (w = XtNameToWidget(menu, "button_7"))
  199.         XtVaSetValues(w, XmNselectColor, color[COL_TOGGLE], NULL);
  200.  
  201.     for (n=0; n < 12; n++)
  202.         XmStringFree(s[n]);
  203.  
  204.     s[0] = XmStringCreateSimple("Today");
  205.     s[1] = XmStringCreateSimple("Tomorrow");
  206.     s[2] = XmStringCreateSimple("This week");
  207.     s[3] = XmStringCreateSimple("Next week");
  208.     s[4] = XmStringCreateSimple("This month");
  209.     s[5] = XmStringCreateSimple("All");
  210.     s[6] = XmStringCreateSimple("Search keywords...");
  211.     menu = XmVaCreateSimplePulldownMenu(menubar, "search", 2,
  212.             search_callback,
  213.             FIX_MENUBAR
  214.             XmVaPUSHBUTTON, s[0], 'T', NULL, NULL,
  215.             XmVaPUSHBUTTON, s[1], 'o', NULL, NULL,
  216.             XmVaPUSHBUTTON, s[2], 'w', NULL, NULL,
  217.             XmVaPUSHBUTTON, s[3], 'N', NULL, NULL,
  218.             XmVaPUSHBUTTON, s[4], 'm', NULL, NULL,
  219.             XmVaPUSHBUTTON, s[5], 'A', NULL, NULL,
  220.             XmVaPUSHBUTTON, s[6], 'S', NULL, NULL,
  221.             NULL);
  222.     XtAddCallback(menu, XmNhelpCallback,
  223.                     help_callback, (XtPointer)"pd_search");
  224.     for (n=0; n < 7; n++)
  225.         XmStringFree(s[n]);
  226.  
  227.     s[0] = XmStringCreateSimple("Week");
  228.     s[1] = XmStringCreateSimple("Month");
  229.     s[2] = XmStringCreateSimple("Year");
  230.     s[3] = XmStringCreateSimple("Goto today");
  231.     s[4] = XmStringCreateSimple("Goto...");
  232.     menu = XmVaCreateSimplePulldownMenu(menubar, "view", 3,
  233.             view_callback,
  234.             FIX_MENUBAR
  235.             XmVaPUSHBUTTON, s[0], 'W', NULL, NULL,
  236.             XmVaPUSHBUTTON, s[1], 'M', NULL, NULL,
  237.             XmVaPUSHBUTTON, s[2], 'Y', NULL, NULL,
  238.             XM_VA_SEPARATOR
  239.             XmVaPUSHBUTTON, s[3], 't', NULL, NULL,
  240.             XmVaPUSHBUTTON, s[4], 'G', NULL, NULL,
  241.             NULL);
  242.     XtAddCallback(menu, XmNhelpCallback,
  243.                     help_callback, (XtPointer)"pd_view");
  244.     for (n=0; n < 5; n++)
  245.         XmStringFree(s[n]);
  246.  
  247.     s[0] = XmStringCreateSimple("On context");
  248.     s[1] = XmStringCreateSimple("Introduction");
  249.     s[2] = XmStringCreateSimple("Getting help");
  250.     s[3] = XmStringCreateSimple("Troubleshooting");
  251.     s[4] = XmStringCreateSimple("Files and programs");
  252.     s[5] = XmStringCreateSimple("X resources");
  253.     (void)XmVaCreateSimplePulldownMenu(menubar, "help", 4,
  254.             help_pulldown,
  255.             FIX_MENUBAR
  256.             XmVaPUSHBUTTON, s[0], 'c', NULL, NULL,
  257.             XM_VA_SEPARATOR
  258.             XmVaPUSHBUTTON, s[1], 'I', NULL, NULL,
  259.             XmVaPUSHBUTTON, s[2], 'G', NULL, NULL,
  260.             XmVaPUSHBUTTON, s[3], 'T', NULL, NULL,
  261.             XmVaPUSHBUTTON, s[4], 'F', NULL, NULL,
  262.             XmVaPUSHBUTTON, s[5], 'X', NULL, NULL,
  263.             NULL);
  264.  
  265.     for (n=0; n < 6; n++)
  266.         XmStringFree(s[n]);
  267.  
  268.     XtManageChild(menubar);
  269.  
  270.     create_month_view(mainwindow);
  271. }
  272.  
  273.  
  274. /*-------------------------------------------------- callbacks --------------*/
  275. /*
  276.  * some item in one of the menu bar pulldowns was pressed. All of these
  277.  * routines are direct X callbacks.
  278.  */
  279.  
  280. /*ARGSUSED*/
  281. static void filemenu_callback(widget, item, data)
  282.     Widget                widget;
  283.     int                item;
  284.     XmToggleButtonCallbackStruct    *data;
  285. {
  286.     switch (item) {
  287.       case 0:                        /* print */
  288.         create_print_popup();
  289.         break;
  290.  
  291.       case 2:                        /* about */
  292.         create_about_popup();
  293.         break;
  294.  
  295.       case 3:                        /* quit */
  296.         exit(0);
  297.     }
  298. }
  299.  
  300. static int period[5] = {1, 7, 31, 90, 366};
  301. /*ARGSUSED*/
  302. static void delpast_callback(widget, item, data)
  303.     Widget                widget;
  304.     int                item;
  305.     XmToggleButtonCallbackStruct    *data;
  306. {
  307.     if (item < 5 && recycle_all(mainlist, TRUE, period[item])) {
  308.         draw_calendar();
  309.         update_all_listmenus();
  310.     }
  311. }
  312.  
  313. /*ARGSUSED*/
  314. static void configmenu_callback(widget, item, data)
  315.     Widget                widget;
  316.     int                item;
  317.     XmToggleButtonCallbackStruct    *data;
  318. {
  319.     switch (item) {
  320.       case 0:                        /* am/pm */
  321.         config.ampm = data->set;
  322.         update_all_listmenus();
  323.         print_icon_name();
  324.         if (config.smallmonth)
  325.             print_button(mainmenu.time,
  326.                     mktimestring(get_time(), FALSE));
  327.         else
  328.             print_button(mainmenu.time, "%s   %s",
  329.                     mkdatestring(get_time(), FALSE),
  330.                     mktimestring(get_time(), FALSE));
  331.         mainlist->modified = TRUE;
  332.         break;
  333.  
  334.       case 1:                        /* sun..sat */
  335.         curr_week += 86400 * (config.sunday_first - data->set);
  336.         config.sunday_first = data->set;
  337.         draw_calendar();
  338.         draw_year_calendar();
  339.         draw_week_calendar();
  340.         mainlist->modified = TRUE;
  341.         break;
  342.  
  343.       case 2:                        /* m/d/y */
  344.         config.mmddyy = data->set;
  345.         update_all_listmenus();
  346.         mainlist->modified = TRUE;
  347.         break;
  348.  
  349.       case 3:                        /* julian */
  350.         config.julian = data->set;
  351.         draw_calendar();
  352.         mainlist->modified = TRUE;
  353.         break;
  354.  
  355.       case 4:                        /* week num */
  356.         config.weeknum = data->set;
  357.         draw_calendar();
  358.         mainlist->modified = TRUE;
  359.         break;
  360.  
  361.       case 5:                        /* auto del */
  362.         config.autodel = data->set;
  363.         mainlist->modified = TRUE;
  364.         break;
  365.  
  366.       case 6:                        /* no past */
  367.         config.nopast = data->set;
  368.         mainlist->modified = TRUE;
  369.         break;
  370.  
  371.       case 7:                        /* wide colmn*/
  372.         destroy_all_listmenus();
  373.         config.bigwarning = data->set;
  374.         mainlist->modified = TRUE;
  375.         break;
  376.  
  377.       case 8:                        /* time adj */
  378.         create_adjust_popup();
  379.         break;
  380.  
  381.       case 9:                        /* alarms */
  382.         create_config_popup();
  383.         break;
  384.  
  385.       case 10:                        /* def hlday */
  386.         create_holiday_popup();
  387.         break;
  388.  
  389.       case 11:                        /* week range*/
  390.         create_weekrange_popup();
  391.         break;
  392.     }
  393. }
  394.  
  395. /*ARGSUSED*/
  396. static void search_callback(widget, item, data)
  397.     Widget                widget;
  398.     int                item;
  399.     XmToggleButtonCallbackStruct    *data;
  400. {
  401.     time_t                now;        /* curr date, 0:00 */
  402.     struct tm            *tm;
  403.  
  404.     now  = get_time();
  405.     now -= now % 86400;
  406.     tm   = time_to_tm(now);
  407.     switch (item) {
  408.       case 0:                        /* Today */
  409.         create_list_popup(mainlist, now,
  410.                 (time_t)0, (char *)0, (struct entry *)0);
  411.         break;
  412.  
  413.       case 1:                        /* Tomorrow */
  414.         create_list_popup(mainlist, now+86400,
  415.                 (time_t)0, (char *)0, (struct entry *)0);
  416.         break;
  417.  
  418.       case 2:                        /* This week */
  419.         now -= (config.sunday_first ?  tm->tm_wday
  420.                         : (tm->tm_wday+6)%7) * 86400;
  421.         create_list_popup(mainlist, now, 7*86400,
  422.                 (char *)0, (struct entry *)0);
  423.         break;
  424.  
  425.       case 3:                        /* Next week */
  426.         now -= (config.sunday_first ?  tm->tm_wday
  427.                         : (tm->tm_wday+6)%7) * 86400;
  428.         create_list_popup(mainlist, now+7*86400, 7*86400,
  429.                 (char *)0, (struct entry *)0);
  430.         break;
  431.  
  432.       case 4:                        /* This month*/
  433.         now -= (tm->tm_mday-1) * 86400;
  434.         create_list_popup(mainlist, now, length_of_month(now),
  435.                 (char*)0, (struct entry *)0);
  436.         break;
  437.  
  438.       case 5:                        /* All */
  439.         create_list_popup(mainlist, (time_t)0,
  440.                 (time_t)0, (char *)0, (struct entry *)0);
  441.         break;
  442.  
  443.       case 6:                        /* Search */
  444.         create_keyword_popup();
  445.         break;
  446.     }
  447. }
  448.  
  449. /*ARGSUSED*/
  450. static void view_callback(widget, item, data)
  451.     Widget                widget;
  452.     int                item;
  453.     XmToggleButtonCallbackStruct    *data;
  454. {
  455.     time_t time = get_time();
  456.     struct tm *tm = time_to_tm(time);
  457.     switch (item) {
  458.       case 0:                        /* week */
  459.         time -= (tm->tm_wday + 6 + config.sunday_first)%7 * 86400;
  460.         curr_week = time;
  461.         create_week_menu();
  462.         break;
  463.  
  464.       case 99:                        /* sm month */
  465.         if (!config.smallmonth) {
  466.             config.smallmonth  = TRUE;
  467.             mainlist->modified = TRUE;
  468.             destroy_month_view();
  469.             create_month_view(mainwindow);
  470.         }
  471.         XRaiseWindow(display, XtWindow(mainmenu.cal));
  472.         break;
  473.  
  474.       case 1:                        /* lg month */
  475.         if (config.smallmonth) {
  476.             config.smallmonth  = FALSE;
  477.             mainlist->modified = TRUE;
  478.             destroy_month_view();
  479.             create_month_view(mainwindow);
  480.         }
  481.         XRaiseWindow(display, XtWindow(mainmenu.cal));
  482.         break;
  483.  
  484.       case 2:                        /* year */
  485.         create_year_menu();
  486.         break;
  487.  
  488.       case 3:                        /* goto today*/
  489.         curr_month = tm->tm_mon;
  490.         curr_year  = tm->tm_year;
  491.         curr_week  = time - 86400 *
  492.                 (tm->tm_wday - !config.sunday_first);
  493.         draw_month_year();
  494.         draw_calendar();
  495.         draw_week_calendar();
  496.         draw_year_calendar();
  497.         break;
  498.  
  499.       case 4:                        /* goto */
  500.         create_goto_popup();
  501.         break;
  502.     }
  503. }
  504.  
  505. /*ARGSUSED*/
  506. static void help_pulldown(widget, item, data)
  507.     Widget                widget;
  508.     int                item;
  509.     XmToggleButtonCallbackStruct    *data;
  510. {
  511.     Cursor                cursor;
  512.     Widget                w;
  513.  
  514.     switch (item) {
  515.       case 0:                        /* context */
  516.         cursor = XCreateFontCursor(display, XC_question_arrow);
  517.         if (w = XmTrackingLocate(mainwindow, cursor, False)) {
  518.             data->reason = XmCR_HELP;
  519.             XtCallCallbacks(w, XmNhelpCallback, &data);
  520.         }
  521.         XFreeCursor(display, cursor);
  522.         break;
  523.  
  524.       case 1:                        /* intro */
  525.         help_callback(mainwindow, "intro");
  526.         break;
  527.  
  528.       case 2:                        /* help */
  529.         help_callback(mainwindow, "help");
  530.         break;
  531.  
  532.       case 3:                        /* trouble */
  533.         help_callback(mainwindow, "trouble");
  534.         break;
  535.  
  536.       case 4:                        /* files */
  537.         help_callback(mainwindow, "files");
  538.         break;
  539.  
  540.       case 5:                        /* widgets */
  541.         help_callback(mainwindow, "widgets");
  542.         break;
  543.     }
  544. }
  545.